/*
 * Copyright 2013 Sigurd Randoll <srandoll@digiway.de>.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.digiway.rapidbreeze.server.infrastructure.rest.url;

import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.core.ClassNamesResourceConfig;
import com.sun.jersey.spi.container.servlet.WebComponent;
import com.sun.jersey.spi.inject.SingletonTypeInjectableProvider;
import com.sun.jersey.test.framework.AppDescriptor;
import com.sun.jersey.test.framework.JerseyTest;
import com.sun.jersey.test.framework.WebAppDescriptor;
import de.digiway.rapidbreeze.server.model.storage.FileStatus;
import de.digiway.rapidbreeze.server.model.storage.StorageProvider;
import de.digiway.rapidbreeze.server.model.storage.StorageProviderDownloadClient;
import de.digiway.rapidbreeze.server.model.storage.StorageProviderRepository;
import de.digiway.rapidbreeze.server.model.storage.UrlStatus;
import de.digiway.rapidbreeze.shared.rest.ResourceLocation;
import de.digiway.rapidbreeze.shared.rest.url.UrlResource;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
import org.junit.Test;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

/**
 *
 * @author Sigurd Randoll <srandoll@digiway.de>
 */
public class UrlInformationResourceIT extends JerseyTest {

    private static StorageProviderRepository storageProviderRepository = mock(StorageProviderRepository.class);

    @Override
    protected AppDescriptor configure() {
        return new WebAppDescriptor.Builder().
                initParam(WebComponent.RESOURCE_CONFIG_CLASS, ClassNamesResourceConfig.class.getName()).
                initParam(ClassNamesResourceConfig.PROPERTY_CLASSNAMES, UrlInformationResource.class.getName() + ";" + UrlResource.class.getName() + ";" + MockStorageProviderRepositoryProvider.class.getName()).
                build();
    }

    @Test
    public void testGetUrlStatus() throws Exception {
        URL url = new URL("http://www.google.de");
        StorageProvider provider = mock(StorageProvider.class);
        StorageProviderDownloadClient client = mock(StorageProviderDownloadClient.class);
        UrlStatus status = mock(UrlStatus.class);

        when(storageProviderRepository.getStorageProvider(url)).thenReturn(provider);
        when(provider.createDownloadClient()).thenReturn(client);
        when(client.getUrlStatus(url)).thenReturn(status);
        when(status.getFileSize()).thenReturn(100L);
        when(status.getFileStatus()).thenReturn(FileStatus.OK);
        when(status.getFilename()).thenReturn("test");

        WebResource webResource = resource();
        URI build = webResource.getUriBuilder().path(ResourceLocation.URL_INFORMATION_RESOURCE_PATH).path(URLEncoder.encode(url.toString())).build();
        UrlResource resource = webResource.uri(build).type(MediaType.APPLICATION_XML).get(UrlResource.class);

        assertEquals(status.getFileSize(), resource.getFilesize());
        assertEquals(status.getFilename(), resource.getFilename());
        assertTrue(resource.isAvailable());
        assertFalse(resource.isNotAvailable());
    }

    @Provider
    public static class MockStorageProviderRepositoryProvider extends SingletonTypeInjectableProvider<Context, StorageProviderRepository> {

        public MockStorageProviderRepositoryProvider() {
            super(StorageProviderRepository.class, storageProviderRepository);
        }
    }
}
